package com.interview.javabasic.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectSimple {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //通过包名获得类对象
        Class rc = Class.forName("com.interview.javabasic.reflect.Robot");
        Robot r = (Robot)rc.newInstance();
        System.out.println("Class name is " + rc.getName());
        //获取该类的私有方法,getDeclaredMethod()可以获取所有的方法，但是不能获取继承的方法或者实现接口的方法。
        Method getHello = rc.getDeclaredMethod("throwHello", String.class);
        getHello.setAccessible(true);//私有方法，不设置这个值为true，就会报错
        Object str = getHello.invoke(r,"Bob");
        System.out.println("getHello result is:" + str);
        //获取该类的公有方法，getMethod只能获取public方法，但是能获取继承类的公用方法和所实现的接口类的方法
        Method sayHi = rc.getMethod("SayHi", String.class);
        sayHi.invoke(r,"Welcome");
        //如何获取私有域
        Field name = rc.getDeclaredField("name");
        name.setAccessible(true);
        name.set(r,"Alice");
        sayHi.invoke(r,"Welcome");
    }

}
